package demo6内部类;

class OuterClass{
    //普通类
    public int data1=1;
    private int date2=2;
    public static int date3=3;

    //内部类：定义在一个类的内部或者是一个方法的内部
    //实例内部类
    /*1、如何获取 实例内部类对象？
    *2、在实例内部类中是否可以 定义静态的成员变量？
    *   public static final data6=6;
    * 3、当外部类中的数据成员 和 内部类中的数据成员 同名 可以通过OuterClass.this.访问外部成员变量
    *    实例内部类中 是 包含 外部类的this的
    * */


    class InnerClass{
        public int data1=1111;
        public int date4=4;
        private int date5=5;
        //public static int date6=6;
        // 不依赖于对象，但内部类依赖于外部类-->冲突-->final定义为常量-->不需要类加载，编译时就能知道值为6

        public void test(){
            System.out.println(date4);
            System.out.println(date5);
            System.out.println("内部类的test方法");
            System.out.println(data1);//1111-->局部优先
            System.out.println(this.data1);//1111
            System.out.println(OuterClass.this.data1);//1
        }
    }

    public void test(){
        System.out.println("外部类的test方法");
        System.out.println(data1);//1
    }

}

interface A{
    void testA();
}

interface B{
    void testB();
}

public class Test {
    public static void main(String[] args) {
        //以下代码可以认为 有一个类实现了A接口 并且 重写了A接口中的方法
        int val=10;
        //val=100;
        new A(){
            @Override
            public void testA() {
                System.out.println("哈哈！");
                System.out.println("值："+val);//10-->在匿名内部类外部、外部类内改变val的值-->匿名内部类内val报错
                //在匿名内部类当中能够访问的是 没有被修改过的数据-->变量的捕获
                //默认在这里能访问的是被final修饰的 常量
            }
        }.testA();//匿名内部类

        //System.out.println(val);
        B b=new B(){
            @Override
            public void testB() {
                System.out.println("嘿嘿！");
            }
        };
        b.testB();

        //实例化内部类1
        OuterClass outerClass=new OuterClass();
        System.out.println(outerClass.data1);

        OuterClass.InnerClass innerClass1=outerClass.new InnerClass();
        innerClass1.test();

        //实例化内部类2
            OuterClass.InnerClass innerClass2=new OuterClass().new InnerClass();
            //获取实例内部类对象依赖于外部类对象
            innerClass2.test();

            outerClass.test();


    }
}
